﻿CREATE PROCEDURE [dbo].[Text_BookTree_AddFirst]
	@parentTreeId BIGINT = NULL,
	@hashTag NVARCHAR(128) = NULL,
	@isHead BIT,
	@published BIT,
	@text NVARCHAR(MAX),
	@currentId INT = NULL OUT
AS
BEGIN
	DECLARE 
		@level TINYINT
		,@left_key BIGINT
		,@right_key BIGINT
		,@bookId UNIQUEIDENTIFIER

	SELECT @level = [Level], @right_key = [RightKey], @bookId = [BookId], @left_key = [LeftKey]
	FROM [dbo].[text_BookTree]
	WHERE [BookTreeId] = @parentTreeId


	BEGIN TRAN

		----1. Обновляем ключи существующего дерева, узлы стоящие за родительским узлом:

		--UPDATE [dbo].[text_BookTree]
		--SET	[LeftKey] = [LeftKey] + 2
		--		, [RightKey] = [RightKey] + 2 
		--WHERE [BookId] = @bookId AND [LeftKey] > @left_key

		--/*Но мы обновили только те узлы в которых изменяются оба ключа, при этом родительскую ветку (не узел, а все родительские узлы) мы не трогали, так как в них изменяется только правый ключ. Следует иметь в виду, что если у нас не будет родительского узла, то есть новый узел будет корневым, то данное обновление проводить нельзя.*/

		----2. Обновляем родительскую ветку:

		--UPDATE [dbo].[text_BookTree]
		--SET [RightKey] = [RightKey] + 2 
		--WHERE [BookId] = @bookId AND [RightKey] >= @right_key AND [LeftKey] < @right_key

		UPDATE [dbo].[text_BookTree]
		SET [LeftKey] = CASE WHEN [LeftKey] > @left_key 
											THEN [LeftKey] + 2 
											ELSE [LeftKey] END, 
				[RightKey] = [RightKey] + 2  
		WHERE [BookId] = @bookId AND [RightKey] > @left_key 

		--3. Теперь добавляем новый узел :

		SELECT @currentId = MAX([BookTreeId]) + 1 FROM [dbo].[text_BookTree]

		SET @text = REPLACE(@text, 'smarly-id-1', 'text-' + CONVERT( NVARCHAR(MAX), @currentId))

		SET IDENTITY_INSERT [dbo].[text_BookTree] ON 
		INSERT INTO [dbo].[text_BookTree]
							 ([BookTreeId]
							 ,[ParentBookTreeId]
							 ,[LeftKey]
							 ,[RightKey]
							 ,[Level]
							 ,[BookId]
							 ,[HashTag]
							 ,[IsHead]
							 ,[Published]
							 ,[Text]
							 ,[UpdateDate])
			 VALUES
						 (@currentId
						 ,@parentTreeId --<ParentBookTreeId, int,>
						 ,@left_key + 1 --<LeftKey, bigint,>
						 ,@left_key + 2 --<RightKey, bigint,>
						 ,@level + 1 --<Level, tinyint,>
						 ,@bookId --<BookId, uniqueidentifier,>
						 ,@hashTag --<HashTag, nvarchar(128),>
						 ,@isHead --<IsHead, bit,>
						 ,@published --<Published, bit,>
						 ,@text --<Text, nvarchar(512),>
						 ,GETUTCDATE())
		SET IDENTITY_INSERT [dbo].[text_BookTree] OFF 

		--4. Проверяем.
		DECLARE @check_result INT
		EXEC	@check_result = [dbo].[Text_BookTree_Check] @bookId = @bookId

	IF @check_result = 0
	BEGIN
		COMMIT TRAN
		RETURN 0
	END
	ELSE
	BEGIN
		ROLLBACK TRAN
		SET @currentId = -1
		RETURN 1
	END
END